package com.tech.service.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.tech.pojo.ItemCatMenu;

/**
* @Title CreateItemCatMenuTreeUtil.java
* @Description 创建菜单树工具类
* @author willard
* @date 2018年12月8日 下午4:54:18
* @version V1.0
*/
public class CreateMenuTreeUtil {
    // 私有化构造函数
    private CreateMenuTreeUtil(){}
    // 静态内部类中创建对象
    private static class SingletonHolder{
        private final static CreateMenuTreeUtil treeUtil = new CreateMenuTreeUtil();
    }
    // 提供公共对方方法
    public static CreateMenuTreeUtil getInstance(){
        return SingletonHolder.treeUtil;
    }

    public  Map<String, Object> findTree(List<ItemCatMenu> allItemCatMenu) {
        Map<String, Object> data = new HashMap<String, Object>();
        try {
            // 查询所有菜单
            List<ItemCatMenu> rootItemCatMenu = new ArrayList<ItemCatMenu>();
            for (ItemCatMenu nav : allItemCatMenu) {
                if (nav.getParentId()==0) {// 父节点是0的，为根节点。
                    rootItemCatMenu.add(nav);
                }
            }
            /* 根据ItemCatMenu类的order排序 */
            // Collections.sort(rootItemCatMenu, order());
            // 为根菜单设置子菜单，getClild是递归调用的
            for (ItemCatMenu nav : rootItemCatMenu) {
                /* 获取根节点下的所有子节点 使用getChild方法 */
                List<ItemCatMenu> childList = getChild(nav.getId(), allItemCatMenu);
                nav.setChildren(childList);// 给根节点设置子节点
            }
            /**
             * 输出构建好的菜单数据。
             *
             */
            data.put("nodes", rootItemCatMenu);
            return data;
        } catch (Exception e) {
            data.put("success", "false");
            data.put("list", new ArrayList<>());
            return data;
        }
    }

    
    /**
     * 获取子节点
     * @param id 父节点id
     * @param allItemCatMenu 所有菜单列表
     * @return 每个根节点下，所有子菜单列表
     */
    private  List<ItemCatMenu> getChild(Long id, List<ItemCatMenu> allItemCatMenu) {
        // 子菜单
        List<ItemCatMenu> childList = new ArrayList<ItemCatMenu>();
        for (ItemCatMenu nav : allItemCatMenu) {
            // 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
            // 相等说明：为该根节点的子节点。
            if (nav.getParentId()==id) {
                childList.add(nav);
            }
        }
        // 递归
        for (ItemCatMenu nav : childList) {
            nav.setChildren(getChild(nav.getId(), allItemCatMenu));
        }
        // 如果节点下没有子节点，返回一个空List（递归退出）
        if (childList.size() == 0) {
            return new ArrayList<ItemCatMenu>();
        }
        return childList;
    }

//    public static void main(String[] args) {
//        Map<String,Object> map = new HashMap<>();
//        ItemCatMenu ItemCatMenu = new ItemCatMenu();
//        ItemCatMenu.setName("name");
//        map.put("obj", ItemCatMenu);
//        System.out.println(map);
//        JSONObject obj = JSONObject.parseObject(JSON.toJSONString(map));
//        System.out.println(obj.toJSONString());
//        Long l = 111L;
//        System.out.println(111==l);
//
//    }

}
